﻿#ifndef CLS_WGTTREEWIDGET_H
#define CLS_WGTTREEWIDGET_H

#include <QTreeWidget>
#include <QToolButton>
#include <QEvent>
#include <QListWidgetItem>
#include <QTranslator>

#include "CLS_TreeItem.hpp"
#include "CLS_WgtBaseTreeWidget.h"

namespace Ui {
class CLS_WgtTreeWidget;
}

/**
类名称 : CLS_WgtTreeWidget
功能 : 树控件实现类
备注 :
典型用法:
**/
class CLS_WgtItemToolBar;
class CLS_WgtTreeWidget : public QWidget
{
    Q_OBJECT
public:
    /**
    函 数 名：  CLS_WgtTreeWidget
    功能描述：  构造函数
    输入参数：  _pParent:父控件 _blChecked:是否带复选框，默认带 _blDrag:是否可拖拽，默认不可拖拽 _iBtnShowType:树节点显示方式，默认鼠标滑过显示
    输出参数：
    返 回 值：
    其   它：
    **/
    explicit CLS_WgtTreeWidget(QWidget *_pParent = nullptr, bool _blChecked = true, bool _blDrag = false, bool _blSearched = true, bool _blRightMenu = true, bool _blDrop = false, n_ItemBtnShowType _iBtnShowType = n_ItemBtnShowType_EnterShow);

    /**
    函 数 名：  ~CLS_WgtTreeWidget()
    功能描述：  析构函数
    输入参数：
    输出参数：
    返 回 值：
    其   它：
    **/
    virtual ~CLS_WgtTreeWidget() override;

    /**
    函 数 名：  LoadStyle
    功能描述：  记载样式
    输入参数：  _qstrStyle：样式字符串
    输出参数：
    返 回 值：
    其   它：
    **/
    int LoadStyle();

    /**
    函 数 名：  Init
    功能描述：  初始化
    输入参数：  _qstrRootId : 根节点ID，_qmapTreeItems : 树信息， _blRootNodeVisible：是否构造显示根节点
    输出参数：
    返 回 值：  0：成功 -1：失败
    其   它：
    **/
    int Init(const QString &_qstrRootId, const QMap<QString, CLS_TreeItem> &_qmapTreeItems, bool _blRootNodeVisible = true);

    /**
    函 数 名：  GetItemById
    功能描述：  按id查询节点信息
    输入参数：  _qstrId : 节点id
    输出参数：  _clsItem:返回的节点信息
    返 回 值：  0：成功 -1：失败
    其   它：
    **/
    int GetItemById(const QString &_qstrId, CLS_TreeItem &_clsItem);

    /**
    函 数 名：  GetItemByName
    功能描述：  按名称查询节点信息
    输入参数：  _qstrName : 节点名称
    输出参数：  _qvecItems:返回的节点队列
    返 回 值： 0：成功 -1：失败
    其   它：
    **/
    int GetItemByName(const QString &_qstrName, QVector<CLS_TreeItem> &_qvecItems);

    /**
    函 数 名：  GetCurrentItem
    功能描述：  获取当前选中的节点
    输入参数：
    输出参数：  _clsItem:节点信息
    返 回 值： 0：成功 -1：失败
    其   它：
    **/
    int GetCurrentItem(CLS_TreeItem &_clsItem);

    /**
    函 数 名：  GetAllItems
    功能描述：  获取全部节点信息
    输入参数：
    输出参数：  _qmapTreeItems : 树信息
    返 回 值：  0：成功 -1：失败
    其   它：
    **/
    int GetAllItems(QMap<QString, CLS_TreeItem> &_qmapTreeItems);

    /**
    函 数 名：  GetCheckedItems
    功能描述：  获取选中复选框节点队列
    输入参数：  _blOnlyLeafNode：是否仅处理叶子节点，默认处理所有勾选的节点
    输出参数：  _qvecItems:选中队列
    返 回 值：  0：成功 -1：失败
    其   它：
    **/
    int GetCheckedItems(QVector<CLS_TreeItem> &_qvecItems, bool _blOnlyLeafNode = false);

    /**
    函 数 名：  GetCheckedNodes
    功能描述：  获取选中复选框的叶子节点队列
    输入参数：   _qvecItems:选中队列
    输出参数：   0：成功 -1：失败
    返 回 值：
    其   它：
    **/
    int GetCheckedNodes(QVector<CLS_TreeItem> &_qvecItems);

    /**
    函 数 名：  Clear
    功能描述：  清空数据和界面
    输入参数：
    输出参数：
    返 回 值：
    其   它：
    **/
    void Clear();

    /**
    函 数 名：  GetChilds
    功能描述：  获得所有子节点
    输入参数：  _qstrId：树Id
    输出参数：  _qvecChilds：子节点， _blRecursive：是否递归处理，默认非递归
    返 回 值： 成功：0 失败：其他值
    其   它：
    **/
    int GetChilds(const QString &_qstrId, QVector<CLS_TreeItem> &_qvecChilds, bool _blRecursive = false);

    /**
    函 数 名：  GetParent
    功能描述：  获得父节点
    输入参数：  _qstrId：树Id
    输出参数：  _parentItem：父节点
    返 回 值： 成功：0 失败：其他值
    其   它：
    **/
    int GetParent(const QString &_qstrId, CLS_TreeItem &_parentItem);

    /**
    函 数 名：  GetItemCheckStatus
    功能描述：  获得节点勾选状态
    输入参数：  _qstrId：树Id _iState：勾选状态
    输出参数：
    返 回 值： 成功：0 失败：其他值
    其   它：
    **/
    int GetItemCheckStatus(const QString &_qstrId, Qt::CheckState &_iState);

    /**
    函 数 名：  SetTextMaxWidth
    功能描述：  设置树节点文本最大宽度
    输入参数：  _iMaxLength:宽度
    输出参数：  
    返 回 值：
    其   它：
    **/
    void SetTextMaxWidth(int _iMaxLength);

public slots:
    /**
    函 数 名：  AddItem
    功能描述：  添加节点
    输入参数：   _clsTreeItem : 节点信息
    输出参数：
    返 回 值：
    其   它：
    **/
    void AddItem(const CLS_TreeItem &_clsTreeItem);

    /**
    函 数 名：  AddItems
    功能描述：  节点信息
    输入参数：   _qvecTreeItems : 节点信息队列
    输出参数：
    返 回 值：
    其   它：
    **/
    void AddItems(const QVector<CLS_TreeItem> &_qvecTreeItems);

    /**
    函 数 名：  DeleteItem
    功能描述：  删除节点
    输入参数：   _strId:节点id
    输出参数：
    返 回 值：
    其   它：
    **/
    void DeleteItem(const QString &_qstrId);

    /**
    函 数 名：  UpdateItem
    功能描述：  更新节点
    输入参数：   _clsItem:节点信息
    输出参数：   0：查询成功 -1：查询失败
    返 回 值：
    其   它：
    **/
    void UpdateItem(const CLS_TreeItem &_clsItem);

    /**
    函 数 名：  UpdateItemIcon
    功能描述：  更新节点图标
    输入参数：   _qstrId:节点信息 _qstrIcon：图标信息
    输出参数：   0：查询成功 -1：查询失败
    返 回 值：
    其   它：
    **/
    void UpdateItemIcon(const QString &_qstrId, const QString &_qstrIcon);
    /**
    函 数 名：  SetCurrentItem
    功能描述：  设置当前选中的节点
    输入参数：   _qstrId:节点id _blSend:true-发信号 false-不发信号
    输出参数：
    返 回 值：
    其   它：
    **/
    void SetCurrentItem(const QString _qstrId, bool _blSend = false);

    /**
    函 数 名：  SetItemCheckStatus
    功能描述：  设置复选框状态
    输入参数：   _qstrId:节点id _iState:选中状态 _blSend:true-发信号 false-不发信号
    输出参数：   0：查询成功 -1：查询失败
    返 回 值：
    其   它：
    **/
    void SetItemCheckStatus(const QString &_qstrId, Qt::CheckState _iState, bool _blSend = false);

    /**
    函 数 名：  设置节点展开状态
    功能描述：  SetItemExpandStatus
    输入参数：   _qstrId : 节点Id _iExpandType：展开方式
    输出参数：
    返 回 值：
    其   它：
    **/
    void SetItemExpandStatus(const QString &_qstrId, n_TreeExpandType _iExpandType);

    /**
    函 数 名：  SetAllExpandStatus
    功能描述：  设置展开所有节点
    输入参数：   _blShow : true-展开全部节点 false-折叠全部节点
    输出参数：
    返 回 值：
    其   它：
    **/
    void SetAllExpandStatus(bool _blShow);

    /**
    函 数 名：  SetShowItemById
    功能描述：  按id模糊过滤显示树列表
    输入参数：   _qstrId : 节点Id
    输出参数：
    返 回 值：
    其   它：
    **/
    void SetShowItemById(const QString &_qstrId);

    /**
    函 数 名：  SetShowItemByName
    功能描述：  按名称模糊过滤树列表
    输入参数：   _qstrName : 节点名称
    输出参数：
    返 回 值：
    其   它：
    **/
    void SetShowItemByName(const QString &_qstrName);

    /**
    函 数 名：  ClearSelect
    功能描述：  清空选中
    输入参数：
    输出参数：
    返 回 值：
    其   它：
    **/
    void ClearSelect();

    /**
    函 数 名：  ClearAndCloseSearch
    功能描述：  清空并关闭搜索
    输入参数：
    输出参数：
    返 回 值：
    其   它：
    **/
    void ClearAndCloseSearch();

    /**
    函数名称: SetSearchVisible
    功   能: 设置搜索控件是否显示
    输入参数: _blVisible(true:显示  false:不显示)
    输出参数：无
    返 回 值：无
    其   他：无
    **/
    void SetSearchVisible(bool _blVisible);

    /**
    函数名称: ClearSearch
    功   能: 清空搜索控件
    输入参数: 无
    输出参数：无
    返 回 值：无
    其   他：无
    **/
    void ClearSearch();

    /**
    函 数 名：  MoveUpOneRow
    功能描述：  上移一行
    输入参数：  _qstrSrcId：源节点Id _qstrDesId：目的节点Id
    输出参数：  无
    返 回 值：  0：成功 <0：失败
    其   它：
    **/
    int MoveUpOneRow(const QString &_qstrSrcId, const QString &_qstrDesId);

    /**
    函 数 名：  MoveDownOneRow
    功能描述：  下移一行
    输入参数：  _qstrSrcId：源节点Id _qstrDesId：目的节点Id
    输出参数：  无
    返 回 值：  0：成功 <0：失败
    其   它：
    **/
    int MoveDownOneRow(const QString &_qstrSrcId, const QString &_qstrDesId);

protected slots:
    /**
    函数名称: ExecuteSearch
    功   能: 执行模糊搜索
    输入参数: 无
    输出参数：无
    返 回 值：无
    其   他：无
    **/
    void ExecuteSearch();

    /**
    函数名称： SignResizeView
    功   能： 屏幕分辨率修改的槽
    参  数：_dXScale：X轴缩放比例    _dYScale：Y轴缩放比例
    返 回 值： 无
    其    他： 无
    **/
    void SlotResizeView(double _dXScale, double _dYScale);

signals:
    /**
    函 数 名：  SignClickButton
    功能描述：  单击按钮
    输入参数：   _qstrId : 节点的id _clsData:button数据
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignClickButton(QString _qstrId, CLS_ItemButton _clsData);

    /**
    函 数 名：  SignClicked
    功能描述：  节点单击
    输入参数：  _qstrId:节点Id _clsData:节点数据
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignClicked(QString _qstrId, CLS_TreeItem _clsData);

    /**
    函 数 名：  SignDblClicked
    功能描述：  节点双击
    输入参数：  _qstrId:节点Id _clsData:节点数据
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignDblClicked(QString _qstrId, CLS_TreeItem _clsData);

    /**
    函 数 名：  SignRightClicked
    功能描述：  节点右键
    输入参数：  _qstrId:节点Id _clsData:节点数据
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignRightClicked(QString _qstrId, CLS_TreeItem _clsData);

    /**
    函 数 名：  SignSelected
    功能描述：  节点选中
    输入参数：   _qstrId:节点Id _clsData:节点数据 _qstrOldId:之前选中节点Id
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignSelected(QString _qstrId, CLS_TreeItem _clsData, QString _qstrOldId);

    /**
    函 数 名：  SignChecked
    功能描述：  节点勾选
    输入参数：  _qstrId:节点Id _blChecked:是否勾选 _clsData:节点数据
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignChecked(QString _qstrId, bool _blChecked, CLS_TreeItem _clsData);

    /**
    函 数 名：  SignCheckedStatusChanged
    功能描述：  节点勾选状态改变信号
    输入参数：  _qstrId:节点Id _blChecked:是否勾选 _clsData:节点数据
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignCheckedStatusChanged(QString _qstrId, bool _blChecked, CLS_TreeItem _clsData);

    /**
    函数名称: SignTreeMenuItemClicked
    功   能: 右键菜单点击
    输入参数: _qstrItemId 菜单的itemId, _blChecked勾选状态
    输出参数：无
    返 回 值：
    其   他：无
    **/
    void SignTreeMenuItemClicked(QString _qstrItemId, bool _blChecked);

    /**
    函 数 名：  SignDroped
    功能描述：  节点拖放信号
    输入参数：  _clsDragItem:拖拽起始节点 _clsDropItem:拖放最终节点
    输出参数：
    返 回 值：
    其   它：
    **/
    void SignDroped(CLS_TreeItem _clsDragItem, CLS_TreeItem _clsDropItem);

private:
    /**
    函数名称: LoadPicPath
    功   能: 加载图片资源路径
    输入参数:无
    输出参数：无
    返 回 值：无
    其   他：无
    **/
    void LoadPicPath();

    /**
    函数名称: InitView
    功   能: 初始化界面控件
    输入参数:无
    输出参数：无
    返 回 值：无
    其   他：无
    **/
    void InitView();

    /**
    函数名称: ConnectSignals
    功   能: 绑定信号
    输入参数: 无
    输出参数：无
    返 回 值：无
    其   他：无
    **/
    void ConnectSignals();

    /**
    函数名称:LoadLang
    功   能:加载qm文件
    输入参数:无
    输出参数：无
    返 回 值：无
    其   他：无
    **/
    void LoadLang();

private slots:
    void on_qlineedtQueryInput_textChanged(const QString &_qstrText);

    void on_qlineedtQueryInput_returnPressed();

    void on_qlistWgtQueryResult_itemDoubleClicked(QListWidgetItem *_pItem);

protected:
    Ui::CLS_WgtTreeWidget *ui;

    /** 功能: m_pWgtTreeWidget - 基础树控件 **/
    CLS_WgtBaseTreeWidget *m_pWgtTreeWidget = nullptr;

    /** 功能: m_qstrPicturePath - 资源图片路径 **/
    QString m_qstrPicturePath = "";

    /** 功能: m_pSearchBtn - 搜索按钮 **/
    QToolButton *m_pSearchBtn = nullptr;

    /** 功能: m_pClearBtn - 清除按钮 **/
    QToolButton *m_pClearBtn = nullptr;

    /** 功能: m_blSearchEnable - 是否支持搜索 **/
    bool m_blSearchEnable = true;

    /** 功能: m_qtTranslator - Qt语言家 **/
    QTranslator m_qtTranslator;
};

#endif // CLS_WGTTREEWIDGET_H
